iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

golang初探系列 第 17

day17-Struct 結構介紹(二)

  • 分享至 

  • xImage
  •  

Struct

構造函數

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func NewPerson(name string, age int) Person {

	return Person{
		Name: name,
		Age:  age,
	}
}

func main() {
	p := NewPerson("john", 16)
	fmt.Printf("%+v", p)
}

Struct Methods

創造 Persoon 結構有 Speak method
這裡要注意的 method 設定是否為 value received 還是 pointer received

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func NewPerson(name string, age int) Person {

	return Person{
		Name: name,
		Age:  age,
	}
}
func (p Person) Speak() {
	fmt.Printf("您好,我是%s 我目前年齡%d\n", p.Name, p.Age)
}

// value type,如果異動 struct 裡面的 feild 記得回傳並接收
func (p Person) IncreateAge() Person {
	fmt.Printf("increate name p 為 %T value recived \n", p)
	p.Age++
	return p

}

// Person ChangeName 為 pointer 方法
func (p *Person) ChangeName(name string) {
	fmt.Printf("change name p 為 %T pointer recived  \n", p)
	p.Name = name
}

func main() {
	p := NewPerson("john", 16)
	p.Speak()
	//如果沒有用變數接受回傳值 p 還是原值
	p.IncreateAge()
	p.Speak()
	//用 p 去接收 回傳參數
	p = p.IncreateAge()
	p.Speak()
	//pointer method 則不用再用變數接收
	p.ChangeName("George")
	p.Speak()

}

自定義類型 method

使用 type 自行定義類型,並設定定義類型 method
可用於當其他 package 無實現此方法,自行實作

package main

import (
	"fmt"
)

//使用 type 自定義類型
type coustomInt int

func (c coustomInt) String() string {

	return fmt.Sprintf("這是一個自行定義的類型 %d", c)
}
func main() {
	//int 類型轉換 coustomInt 類型
	c := coustomInt(100)
	fmt.Println(c.String())

}

Anonymous field in a struct

feild 較少,較為簡單的場景才會使用到

package main

import (
	"fmt"
)

type Person struct {
	string
	int
}

func main() {
	p := Person{"jonh", 20}
	fmt.Printf("%+v\n", p)
	fmt.Println(p.string)
	fmt.Println(p.int)

}

Embedding Struct

範例當中 Company 演示了如何實作類似 OOP 當中的繼承 使用 Anonymous field 及 Embedding Struct
方法來呼叫 String() 方法

package main

import (
	"fmt"
)

type Address struct {
	city string
}

func (a Address) String() string {
	fmt.Println("Address string mehod is called")
	return a.city
}

type Person struct {
	name string
	age  int
	addr Address
}
type Company struct {
	name    string
	Address //Anonymous field
}

func main() {
	p := Person{
		name: "jonh",
		age:  20,
		addr: Address{
			city: "台北市",
		},
	}
	fmt.Printf("%+v \n", p)
	fmt.Println(p.addr.city)
	fmt.Println(p.addr.String())
	c := Company{
		name: "104",
		Address: Address{
			city: "台中市",
		},
	}
	//類似於繼承方式可以使用 Address struct method
	fmt.Println(c.String())

}

補充資料

Type embedding in Go


上一篇
day16-Struct 結構介紹(一)
下一篇
day18-控制流程(if 及 switch)
系列文
golang初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言